package com.example.demo.BookService.impl.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.BookService.impl.UserService;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.demo.LoginUser;
import com.example.demo.commom.Result;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
import com.example.demo.utils.TokenUtils;

import javax.annotation.Resource;
import java.util.List;


@Service
public class UserServiceImpl implements UserService {

    @Resource
    UserMapper userMapper;

    /**
     * 用户注册
     * @param user
     * @return
     */
    public Result<?> insert(User user) {
        // 使用mybatis-plus进行数据库的查询，判断用户输入的账号是否有重复
        User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()));
        if (res != null) {
            // 查询到数据，说明该用户名已经存在
            return Result.error("-1", "用户名已重复");
        }
        // 插入用户数据
        userMapper.insert(user);
        return Result.success();
    }

    /**
     * 用户登录
     * @param user
     * @return
     */
    public Result<?> userLogin(User user) {
        // 使用mybatis-plus进行数据库的查询，判断用户输入的账号密码是否匹配
        User res = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, user.getUsername()).eq(User::getPassword, user.getPassword()));
        if (res == null) {
            return Result.error("-1", "用户名或密码错误");
        }
        String token = TokenUtils.genToken(res);
        res.setToken(token);

        // 每次登录记录总访问数加1
        LoginUser loginuser = new LoginUser();
        loginuser.addVisitCount();

        return Result.success(res);
    }

    /**
     * 设置默认密码
     * @param user
     */
    public void setDefaultPassword(User user) {
        if (user.getPassword() == null) {
            user.setPassword("abc123456");
        }
        userMapper.insert(user);
    }

    /**
     * 修改密码
     * @param id
     * @param password2
     */
    public void setPassword(Integer id, String password2) {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);// 根据id查询用户
        User user = new User();
        user.setPassword(password2);// 设置新密码
        userMapper.update(user, updateWrapper);
    }

    /**
     * 修改读者个人信息
     * @param user
     */
    public void updateById(User user) {
        userMapper.updateById(user);
    }

    /**
     * 根据id删除读者用户
     * @param ids
     */
    public void deleteBatchIds(List<Integer> ids) {
        userMapper.deleteBatchIds(ids);
    }

    /**
     * 根据id删除用户
     * @param id
     */
    public void deleteById(Long id) {
        userMapper.deleteById(id);
    }

    /**
     * 根据用户昵称分页查询
     * @param pageNum
     * @param pageSize
     * @param search
     * @return
     */
    public Page<User> findPage1(Integer pageNum, Integer pageSize, String search) {
        LambdaQueryWrapper<User> wrappers = Wrappers.<User>lambdaQuery();
        if (StringUtils.isNotBlank(search)) {
            wrappers.like(User::getNickName, search);
        }
        wrappers.like(User::getRole, 2);// 只查询读者
        return userMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);
    }

    /**
     * 管理员分页查询和条件查询读者用户信息
     * 只查询身份为读者的账号，不查询管理员的账号
     * @param pageNum
     * @param pageSize
     * @param search1
     * @param search2
     * @param search3
     * @param search4
     * @return
     */
    public Page<User> findPage2(Integer pageNum, Integer pageSize, String search1, String search2, String search3, String search4) {
        // 指定查询条件将应用于User实体类
        LambdaQueryWrapper<User> wrappers = Wrappers.<User>lambdaQuery();
        if (StringUtils.isNotBlank(search1)) {
            // 用户编号
            wrappers.like(User::getId, search1);
        }
        if (StringUtils.isNotBlank(search2)) {
            // 用户昵称
            wrappers.like(User::getNickName, search2);
        }
        if (StringUtils.isNotBlank(search3)) {
            // 用户电话
            wrappers.like(User::getPhone, search3);
        }
        if (StringUtils.isNotBlank(search4)) {
            // 用户地址
            wrappers.like(User::getAddress, search4);
        }
        // 只查询读者用户
        wrappers.like(User::getRole, 2);
        return userMapper.selectPage(new Page<>(pageNum, pageSize), wrappers);// 根据wrappers指定的查询条件分页查询
    }
}
